#include "UserModel.hpp"
#include "db.h"
#include <iostream>
#include <string>
#include <cassert>

bool UserModel::insert(User &user)
{
     // 向User中插入一列
     char buffer[128]; // 注意占位符用单引号呀，因为占位符就是一个字符
     int n = sprintf(buffer, "insert into User (name,password,state)values('%s','%s','%s')",
                     user.getName().c_str(), user.getPassword().c_str(), user.getState().c_str());

     // 注意，断言是真无事发生，断言是假程序有假
     assert(n != 0);
     (void)n;

     MySQL sql;
     if (sql.connect())
     {
          // string的构造函数就可以 将char转为string
          if (sql.update(buffer))
          {
               // 获取新插入的行信息的id（因为id是auto_increment自增主键，我们无法提前预设）
               user.setId(mysql_insert_id(sql.getConnection()));
               return true;
          }
     }
     return false;
}

User UserModel::query(int id)
{
     char buffer[128];
     int n = sprintf(buffer, "select * from User where id = %d", id);

     assert(n != 0);
     (void)n;

     MySQL sql;
     if (sql.connect())
     {
          MYSQL_RES *res = sql.query(buffer);

          // 如果res不为空则说明找到了这个id，故定义一个User对象，提取查询返回结果作为函数的返回值
          if (res != nullptr)
          {
               // 把查询结果按行读取，此时再利用mysql的 operator[]运算符把对应行属性全部提取出来
               MYSQL_ROW row = mysql_fetch_row(res);

               User user;
               user.setId(atoi(row[0]));
               user.setName(row[1]);
               user.setPassword(row[2]);
               user.setState(row[3]);
               
               //一定要记得释放字符集,因为我们用的是它new出来的指针
               mysql_free_result(res);
               return user;
          }
     }

     // res为空的结果
     return User();
}

bool UserModel::updateState(User &user)
{
     char buffer[128];
     sprintf(buffer, "update User set state='%s' where id = %d", user.getState().c_str(), user.getId());

     MySQL sql;
     if(sql.connect())
     {
          if(sql.update(buffer))
          return true;
     }

     return false;
}


void UserModel::resetState()
{
     
      char buffer[128];
     sprintf(buffer, " update User set state='offline' ");

     MySQL sql;
     if(sql.connect())
          sql.update(buffer);
}